<?php

namespace App\Api;

/**
 * https://docs.qq.com/doc/DRUlEamNJWFFhVmVR
 */

use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Logger;


class Transfer
{
    public function __construct()
    {
        ini_set('max_execution_time', 300);
        $this->log = new Logger('Transfer');
        $this->log->pushHandler(
            (new RotatingFileHandler(storage_path('/logs/Transfer.log'), 14, Logger::DEBUG, true, 0777))->setFormatter(new LineFormatter(null, null, true, true))
        );
    }

    // 统一调用接口 也就是 所有的订单的下单接口 都是从这个地方下单的
    public function __call($name, $args)
    {
        // $this->log->info('方法名称' . $name . '参数' . json_encode($args));
        //1: 查询订单的通道
        // 调用方法 如果失败了 返回什么信息 如果成功了 返回什么信息 如果失败 直接就都返回空 如果成功就是
        // 直接将第三方的数据 返回或者处理
        // var_dump($name);
        if (!empty($args[0])) {
            $args = $args[0];
        }
//        print_r($args);
        $orders = '';
        if (!empty($args['ordersno']) && $name == 'orderSubmit') {
            $isTrueSuccess = Cache::get($args['ordersno'] . '_isTransfer');
            // var_dump($isTrueSuccess, 1111111111);
            if (!empty($isTrueSuccess) && $isTrueSuccess == 1) {
                return [
                    'code' => 500,
                    'msg' => '请五分钟后提交',
                    'data' => [
                        'msg' => '请五分钟后提交'
                    ]
                ];
            }
            Cache::put($args['ordersno'] . '_isTransfer', 1, Carbon::now()->addMinutes(5));
            $orders = $args['ordersno'];
        }
        if (!empty($args['ordersno']) && !empty($args['orderno'])) {
            $y_order = $args['orderno'];
            $args['orderno'] = $args['ordersno'];
            $args['ordersno'] = $y_order;
        }

        $flag = true;
        $msg = '';
        // channel_id = model
        // $args['model'] 是channel_id 参数
        if (empty($args['model'])) {
            $flag = false;
            $msg = '参数传递错误';
        }
        // 查通道的信息
        $obj = null;
        if ($flag) {
            if (!class_exists($args['path'])) {
                $flag = false;
                $msg = '方法不存在';
            }
        }

        if ($flag) {
            // 生产审核 一  省市区的判断是模糊查询
            if ($name == 'orderSubmit' && !empty($args['model'])) {
                $return = $this->wayVaild($args['model'], $args);
                if (!empty($return['code']) && $return['code'] != 200) {
                    // 直接返回 不往第三方提交
                    if (!empty($orders)) {
                        // Cache::put($orders . '_isTransfer', 0, Carbon::now()->addMinutes(5));
                    }
                    return ['code' => 101, 'msg' => !empty($return['msg']) ? '生产审核:' . $return['msg'] : '生产审核没通过', ['msg' => !empty($return['msg']) ? '生产审核:' . $return['msg'] : '生产审核没通过']];
                }
            }
        }
        // wayVaildTwo
        if ($flag) {
            // 生产审核 二  省市区的判断需要自己输入城市地区
            if ($name == 'orderSubmit' && !empty($args['model'])) {
                $return = $this->wayVaildTwo($args['model'], $args);
                $this->log->info('城市区限制返回参数' . json_encode($return));
                if (!empty($return['code']) && $return['code'] != 200) {
                    // 直接返回 不往第三方提交
                    if (!empty($orders)) {
                        // Cache::put($orders . '_isTransfer', 0, Carbon::now()->addMinutes(5));
                    }
                    return ['code' => 101, 'msg' => !empty($return['msg']) ? '生产审核:' . $return['msg'] : '生产审核没通过', 'data' => ['msg' => !empty($return['msg']) ? '生产审核:' . $return['msg'] : '生产审核没通过']];
                }
            }
        }
        if (!empty($args['post_identity'])) {
            $args['post_identity'] = strtoupper($args['post_identity']);
        }

        if ($flag) {
            // var_dump($args);
            $obj = new $args['path']($args['url'], $args['parame']);
            if (method_exists($obj, $name)) {
                $res = $obj->$name($args);
                $this->log->info('提交返回信息方法名称' . $name . '参数' . json_encode($args) . '返回信息:' . json_encode($res));
                if (!empty($orders)) {
                    // Cache::put($orders . '_isTransfer', 0, Carbon::now()->addMinutes(5));
                }
                return $res;
            }
            $msg = '该方法不存在,请联系管理员';
        }
        $this->log->info('未提交返回信息方法名称' . $name . '参数' . json_encode($args) . '返回信息:' . $msg);
        if (!empty($orders)) {
            // Cache::put($orders . '_isTransfer', 0, Carbon::now()->addMinutes(5));
        }
        return [
            'code' => 100,
            'msg' => $msg,
            'data' => [
                'msg' => $msg
            ]
        ];
    }

    // 渠道验证  一
    public function wayVaild($id, $data)
    {
        //渠道验证
        $where = [
            'status' => 0,
            'channel_id' => $id
        ];
        $isTrue = DB::table('way_exam')->where($where)->get();
        $flag = true;
        $msg = '';
        if ($isTrue) {
            foreach ($isTrue as $key => $v) {
                $v = json_decode(json_encode($v), true);
                $returns = $this->oneWayVaild($data, $v);
                if (!empty($returns['code']) && $returns['code'] != 200) {
                    $flag = false;
                    $msg = !empty($returns['msg']) ? $returns['msg'] : '未知错误';
                    break;
                }
            }
        }
        if (!$flag) {
            return ['code' => 300, 'msg' => $msg];
        }
        return ['code' => 200, 'msg' => '无需验证'];
    }

    /**
     * Undocumented function
     *
     * @param [type] $data  提到第三方的参数
     * @param [type] $array 验证参数
     * @return void   第一个表的验证  省市区 其中的模糊配置
     */
    public function oneWayVaild($data, $array)
    {
        if (empty($array)) {
            return ['code' => 200, 'msg' => '验证通过'];
        }
        $flag = true;
        $msg = '未知错误';
        $isSubmit = true;
        // 来源限制
        $sourceFlag = 1;
        if (!empty($array['source'])) {
            $sourceFlag = 2;
            if (empty($data['source']) || $array['source'] == $data['source']) {
                $sourceFlag = 3;
            }
        }
        // 渠道限制
        $channelFlag = 1;
        if (!empty($array['channel_code'])) {
            $channelFlag = 2;
            if ($array['type'] == 2) {
                if (empty($data['product_code']) || $array['channel_code'] == $data['product_code']) {
                    $channelFlag = 3;
                }
            } else {
                if (empty($data['channel_code']) || $array['channel_code'] == $data['channel_code']) {
                    $channelFlag = 3;
                }
            }
        }
        // 年龄限制   在时间限制中的年龄限制
        $flagAge = 1;
        if (!empty($array['max_age']) && !empty($array['min_age'])) {
            $$flagAge = 2;
            if (empty($data['pay_identity'])) {
                $flagAge = 3;
                $msg = '身份信息为空';
            }
            if ($flagAge) {
                $age = getIdentityAge($data['pay_identity']);
                if ($age >= $array['min_age'] && $age <= $array['max_age']) {
                    $flagAge = 3;
                    $msg = '年龄信息验证不多';
                }
            }
        }

        // 时间限制
        $flagTime = 1;
        if (!empty($array['start_time']) && !empty($array['end_time'])) {
            $flagTime = 2;
            if (empty($data['created_at'])) {
                $flagTime = 3;
                $msg = '提交时间失败';
            }
            if ($flagTime) {
                $time = explode(' ', $data['created_at']);
                if (empty($time[1])) {
                    $flagTime = 3;
                    $msg = '创建时间创建错误';
                }
                $time = date('Y-m-d  ' . $time[1]);
                $start_time = date('Y-m-d ' . $array['start_time']);
                $end_time = date('Y-m-d ' . $array['end_time']);
                if (strtotime($time) >= strtotime($start_time) && strtotime($time) <= strtotime($end_time)) {
                    $flagTime = 3;
                    $msg = '时间信息验证不过';
                }
            }
        }

        // 地区限制 省市区
        $flagProv = 1;
        if (!empty($array['prov']) && !empty($array['field'])) {
            $flagProv = 2;
            if ($array['prov'] == 1) {
                if (empty($data['post_province'])) {
                    $flagProv = 3;
                    $msg = '省份为空';
                }
                if ($flag) {
                    $countPro = explode($array['field'], $data['post_province']);
                    if (count($countPro) > 1) {
                        $flagProv = 3;
                        $msg = '省份限制';
                    }
                }
            }
            if ($array['prov'] == 2) {
                if (empty($data['post_city'])) {
                    $flagProv = 3;
                    $msg = '城市为空';
                }
                if ($flag) {
                    $countPro = explode($array['field'], $data['post_city']);
                    if (count($countPro) > 1) {
                        $flagProv = 3;
                        $msg = '城市限制';
                    }
                }
            }
            if ($array['prov'] == 3) {
                if (empty($data['post_area'])) {
                    $flagProv = 3;
                    $msg = '区域为空';
                }
                if ($flag) {
                    $countPro = explode($array['field'], $data['post_area']);
                    if (count($countPro) > 1) {
                        $flagProv = 3;
                        $msg = '区域验证限制';
                    }
                }
            }
        }

        // 是否提交  is_submit=1 可以提交  不可提交
        if (isset($array['is_submit']) && $array['is_submit'] == 1) {
            $isSubmit = false;
        }
        if ($flagTime == 1 && $flagAge == 1 && $flagProv == 1 && $channelFlag == 1 && $sourceFlag == 1) {
            return ['code' => 200, 'msg' => '没有设置验证'];
        }
        // 设置的是不需要提交
        if ($isSubmit) {
            if ($flagTime == 3 && $flagAge == 3 && $sourceFlag == 3 && $channelFlag == 3 && $flagProv != 3) {
                return ['code' => 300, 'msg' => '被时间,年龄,套餐,来源限制了'];
            }
            if ($flagProv == 3) {
                return ['code' => 200, 'msg' => !empty($msg) ? $msg : '不满足限制条件5'];
            }
            return ['code' => 200, 'msg' => !empty($msg) ? $msg : '不满足限制条件6'];
        }
        // 设置的需要提交
        if (!$isSubmit) {
            if ($flagTime == 3 && $flagAge == 3 && $sourceFlag == 3 && $channelFlag == 3 && $flagProv != 3) {
                return ['code' => 200, 'msg' => !empty($msg) ? $msg : '在时间限制和年龄限制内可以提交'];
            }
            if ($flagProv == 3) {
                return ['code' => 300, 'msg' => !empty($msg) ? $msg : '不满足限制条件7'];
            }
            return ['code' => 300, 'msg' => !empty($msg) ? $msg : '不满足限制条件8'];
        }
        // 默认都可以提交
        return ['code' => 200, 'msg' => '可以提交'];
        // 1: 如果在省市区范围内的话 应该如何处理
        // 2: 不在省市区范围内 时间和限制&&关系
        // 3: 时间和年龄的关系 还有省市县的关系
        die();
        // 早上 8.30 - 21.30 年龄在 24- 40 并且 区 不是 县的  不可提交
        // 时间 && !省市区 && 年龄
        // var_dump($flagAge, 111111);
        // var_dump($flagTime, 2222222);
        if ($isSubmit) {
            if (($flagTime == 3 && $flagAge == 3) && $flagProv != 3) {
                // if ($isSubmit) {
                // }
                // 不提交的
                return ['code' => 300, 'msg' => $msg];
            }
        }
        // if (!$isSubmit) {
        //     if ($flagProv != 3 || $flagTime != 3 || $flagAge != 3) {
        //         return ['code' => 300, 'msg' => $msg];
        //     }
        // }
        // if ($flagProv == 3 && $flagTime == 3 && $flagAge == 3) {
        //     if ($isSubmit) {
        //         // 不提交的
        //         return ['code' => 200, 'msg' => '可以提交'];
        //     }
        //     if (!$isSubmit) {
        //         return ['code' => 300, 'msg' => '可以提交3'];
        //     }
        // }


        return ['code' => 200, 'msg' => '可以提交4'];
    }

    // 渠道验证  二
    public function wayVaildTwo($id, $data)
    {
        //渠道验证
        $where = [
            'status' => 0,
            'channel_id' => $id
        ];
        // $this->log->info('审核返回的参数的条件' . json_encode($where));
        $isTrue = DB::table('way_exam_two')->where($where)->get();
        $flag = true;
        $msg = '';
        if ($isTrue) {
            foreach ($isTrue as $key => $v) {
                $v = json_decode(json_encode($v), true);
                $returns = $this->oneWayVaildTwo($data, $v);
                $this->log->info('审核返回的参数' . json_encode($data) . '结果' . json_encode($returns));
                if (!empty($returns['code']) && $returns['code'] == 200) {
                    $flag = true;
                    $msg = !empty($returns['msg']) ? $returns['msg'] : '验证成功';
                    break;
                }
                if (!empty($returns['code']) && $returns['code'] == 300) {
                    $flag = false;
                    $msg = !empty($returns['msg']) ? $returns['msg'] : '未知错误';
                    // break;
                }
            }
        }
        if (!$flag) {
            return ['code' => 300, 'msg' => $msg];
        }
        return ['code' => 200, 'msg' => '无需验证'];
    }

    /**
     * Undocumented function
     *
     * @param [type] $data  提到第三方的参数
     * @param [type] $array 验证参数
     * @return void   第二个表的验证  不同之处 是 限制城市要自己输入
     */
    public function oneWayVaildTwo($data, $array)
    {
        if (empty($array)) {
            return ['code' => 200, 'msg' => '验证通过'];
        }
        $flag = true;
        $msg = '未知错误';
        $isSubmit = true;
        // 来源限制
        $sourceFlag = 1;
        if (!empty($array['source'])) {
            $sourceFlag = 2;
            if (empty($data['source']) || $array['source'] == $data['source']) {
                $sourceFlag = 3;
            }
        }
        // 渠道限制
        $channelFlag = 1;
        if (!empty($array['channel_code'])) {
            $channelFlag = 2;
            if (empty($data['channel_code']) || $array['channel_code'] == $data['channel_code']) {
                $channelFlag = 3;
            }
        }
        // 产品限制 product_code
        // 年龄限制   在时间限制中的年龄限制
        $flagAge = 1;
        if (!empty($array['max_age']) && !empty($array['min_age'])) {
            $$flagAge = 2;
            if (empty($data['pay_identity'])) {
                $flagAge = 3;
                $msg = '身份信息为空';
            }
            if ($flagAge) {
                $age = getIdentityAge($data['pay_identity']);
                if ($age >= $array['min_age'] && $age <= $array['max_age']) {
                    $flagAge = 3;
                    $msg = '年龄信息验证不多';
                }
            }
        }

        // 时间限制
        $flagTime = 1;
        if (!empty($array['start_time']) && !empty($array['end_time'])) {
            $flagTime = 2;
            if (empty($data['created_at'])) {
                $flagTime = 3;
                $msg = '提交时间失败';
            }
            if ($flagTime) {
                $time = explode(' ', $data['created_at']);
                if (empty($time[1])) {
                    $flagTime = 3;
                    $msg = '创建时间创建错误';
                }
                $time = date('Y-m-d  ' . $time[1]);
                $start_time = date('Y-m-d ' . $array['start_time']);
                $end_time = date('Y-m-d ' . $array['end_time']);
                if (strtotime($time) >= strtotime($start_time) && strtotime($time) <= strtotime($end_time)) {
                    $flagTime = 3;
                    $msg = '时间信息验证不过';
                }
            }
        }

        // 地区限制 省市区   这个字段 remark字段
        $flagProv = 1;
        if (!empty($array['remark'])) {
            $flagProv = 2;
            // $data['post_area']
            // $data['post_province']
            // $data['post_city']
            $arrayRemark = explode(',', $array['remark']);
            if (!empty($arrayRemark)) {
                foreach ($arrayRemark as $key => $v) {
                    $oneProvince = strpos($data['post_province'], $v);
                    if (isset($oneProvince) && $oneProvince !== false) {
                        $flagProv = 3;
                        break;
                    }
                    $oneCity = strpos($data['post_city'], $v);
                    if (isset($oneCity) && $oneCity !== false) {
                        $flagProv = 3;
                        break;
                    }
                    $oneArea = strpos($data['post_area'], $v);
                    if (isset($oneArea) && $oneArea !== false) {
                        $flagProv = 3;
                        break;
                    }
                }
            }
        }

        // 是否提交  is_submit=1 可以提交  不可提交
        if (isset($array['is_submit']) && $array['is_submit'] == 1) {
            $isSubmit = false;
        }
        if ($flagTime == 1 && $flagAge == 1 && $flagProv == 1 && $channelFlag == 1 && $sourceFlag == 1) {
            return ['code' => 200, 'msg' => '没有设置验证'];
        }
        $this->log->info('时间限制' . !empty($data['orderno']) ? $data['orderno'] : '' . $flagTime . '年龄设置:' . $flagAge . '来源设置' . $sourceFlag . '渠道设置:' . $channelFlag . '省市区限制' . $flagProv);
        if ($sourceFlag != 3 || $channelFlag != 3) {
            return ['code' => 400, 'msg' => '应该通过'];
        }
        // 设置的是不需要提交
        if ($isSubmit) {
            if ($sourceFlag != 3 || $channelFlag != 3) {
                return ['code' => 400, 'msg' => '审核限制1'];
            }
            if ($flagTime == 3 && $flagAge == 3 && $sourceFlag == 3 && $channelFlag == 3 && $flagProv == 3) {
                return ['code' => 300, 'msg' => '审核限制'];
            }
            if ($flagProv == 3) {
                return ['code' => 200, 'msg' => !empty($msg) ? $msg : '不满足限制条件1'];
            }
            return ['code' => 200, 'msg' => !empty($msg) ? $msg : '不满足限制条件2'];
        }
        // 设置的需要提交
        if (!$isSubmit) {

            if ($flagTime == 3 && $flagAge == 3 && $sourceFlag == 3 && $channelFlag == 3 && $flagProv == 3) {
                return ['code' => 200, 'msg' => !empty($msg) ? $msg : '在时间限制和年龄限制内可以提交'];
            }
            if ($flagProv == 3) {
                return ['code' => 300, 'msg' => !empty($msg) ? $msg : '不满足限制条件3'];
            }
            return ['code' => 300, 'msg' => !empty($msg) ? $msg : '不满足限制条件4'];
        }
        // 默认都可以提交
        return ['code' => 200, 'msg' => '可以提交'];
        // 1: 如果在省市区范围内的话 应该如何处理
        // 2: 不在省市区范围内 时间和限制&&关系
        // 3: 时间和年龄的关系 还有省市县的关系
        die();
        // 早上 8.30 - 21.30 年龄在 24- 40 并且 区 不是 县的  不可提交
        // 时间 && !省市区 && 年龄
        // var_dump($flagAge, 111111);
        // var_dump($flagTime, 2222222);
        if ($isSubmit) {
            if (($flagTime == 3 && $flagAge == 3) && $flagProv != 3) {
                // if ($isSubmit) {
                // }
                // 不提交的
                return ['code' => 300, 'msg' => $msg];
            }
        }
        // if (!$isSubmit) {
        //     if ($flagProv != 3 || $flagTime != 3 || $flagAge != 3) {
        //         return ['code' => 300, 'msg' => $msg];
        //     }
        // }
        // if ($flagProv == 3 && $flagTime == 3 && $flagAge == 3) {
        //     if ($isSubmit) {
        //         // 不提交的
        //         return ['code' => 200, 'msg' => '可以提交'];
        //     }
        //     if (!$isSubmit) {
        //         return ['code' => 300, 'msg' => '可以提交3'];
        //     }
        // }


        return ['code' => 200, 'msg' => '可以提交4'];
    }
}
